package lombok.demo;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

/**
 * {@code @Getter/@Setter}：使用@Getter/@Setter注释任何字段，lombok自动生成默认的getter/setter。
 * 可以在类上使用这些注解，其等同于为类中所有非静态字段添加了此注解(TIPS:也就是说，若想静态字段也生成方法还是需要手动加)<p>
 * <p>
 * 属性解析: <p>
 * value: 生成的访问器的访问级别，默认修饰符是PUBLIC。如果希望是非公共的，可以指定另一个访问级别作为代替。
 * 除合法访问级别 PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE 之外，还有一种特殊的 NONE 访问级别来手动禁用字段的getter/setter生成，
 * 从而覆盖掉类上的 @Getter，@Setter或@Data注解的行为。<p>
 *
 * <p>
 * Getter专有属性解析: <p>
 * lazy: 是否使用懒加载，默认为false。前提：只能在字段上使用、字段必须使用 private final 修饰、字段不能使用 transient 修饰。
 * 懒加载也就是只有在使用getter的时间，才开始缓存该值，因此如果该值占用大量内存或者计算该值需要大量CPU资源，这会很有用。
 * TIPS:懒加载的字段类型会被破坏成一个AtomicReference。
 *
 * @author yexi
 */
@Getter
@Setter
public class GetterSetterDemo extends SuperClass{

    private static @Getter int staticValue;

    private @Setter(value = AccessLevel.PROTECTED) int age;

    private @Setter(value = AccessLevel.PRIVATE) char sex;

    private int height = 120;

    private boolean high;

    private @Getter(value = AccessLevel.NONE) float money;

    private final @Getter(lazy = true) double[] cached = expensive();

    private double[] expensive() {
        double[] result = new double[1000];
        for (int i = 0; i < result.length; i++) {
            result[i] = Math.asin(i);
        }
        return result;
    }

    public static class Son extends GetterSetterDemo {

    }
}
